#include "RingQueue.hpp"
#include <iostream>
#include <pthread.h>
#include <unistd.h>
using namespace std;

void *consumer(void *args)
{
    RingQueue<int> *rq = static_cast<RingQueue<int> *>(args);

    while (true)
    {
        sleep(2);
        // 1. 消费任务
        int t = 0;
        rq->Pop(&t);

        // 2. 处理任务 -- 处理任务的时候，这个任务，已经被拿到线程的上下文中了,不属于队列了
        cout << "消费者拿到了一个数据: " << t << endl;
    }
}

void *productor(void *args)
{
    RingQueue<int> *rq = static_cast<RingQueue<int> *>(args);
    int data = 1;
    while (true)
    {
        // 1. 获得任务
        cout << "生产了一个任务: " << data << endl;

        // 2. 生产任务
        rq->Equeue(data);
        data++;
    }
}

int main()
{
    // 申请阻塞队列
    RingQueue<int> *rq = new RingQueue<int>();

    // 单生产单消费
    // 如果我们改成多生产多消费呢？
    // 单单：cc、pp -> 互斥关系不需要维护，cp之间已经互斥和同步了
    // 多多：cc、pp -> 需要维护生产者之间、消费者之间的互斥关系
    pthread_t c[2], p[3];

    pthread_create(c, nullptr, consumer, rq);
    pthread_create(c + 1, nullptr, consumer, rq);
    pthread_create(p, nullptr, productor, rq);
    pthread_create(p + 1, nullptr, productor, rq);
    pthread_create(p + 2, nullptr, productor, rq);

    pthread_join(c[0], nullptr);
    pthread_join(c[1], nullptr);
    pthread_join(p[0], nullptr);
    pthread_join(p[1], nullptr);
    pthread_join(p[2], nullptr);

    return 0;
}